package com.mall.websocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

import static com.mall.websocket.SendMsgTool.BroadCastInfo;
@ServerEndpoint(value = "/ws/asset")
@Component
@Slf4j
public class WebSocketServer {
   private static final AtomicInteger OnlineCount = new AtomicInteger(0);
   /** concurrent包的线程安全Set，用来存放每个客户端对应的Session对象。 */
   private static CopyOnWriteArraySet<Session> SessionSet = new CopyOnWriteArraySet<Session>();

   @PostConstruct
   public void init() {
      log.info("websocket 加载");
   }

   /** 连接建立成功调用的方法 */
   @OnOpen
   public void onOpen(Session session) {
      SessionSet.add(session);
      int cnt = OnlineCount.incrementAndGet(); // 在线数加1
      log.info("有连接加入，当前连接数为：{}", cnt);
//      SendMessage(session, "连接成功");
      BroadCastInfo("连接成功", SessionSet);
   }

   /** 连接关闭调用的方法 */
   @OnClose
   public void onClose(Session session) {
      SessionSet.remove(session);
      int cnt = OnlineCount.decrementAndGet();
      log.info("有连接关闭，当前连接数为：{}", cnt);
   }

   /** 收到客户端消息后调用的方法 */
   @OnMessage
   public void onMessage(String message, Session session) {
      log.info("来自客户端的消息：{}", message);
//      SendMessage(session, "收到消息，消息内容：" + message);

      BroadCastInfo(message, SessionSet);

   }

   /** 出现错误 */
   @OnError
   public void onError(Session session, Throwable error) {
      log.error("发生错误：{}，Session ID： {}", error.getMessage(), session.getId());
      error.printStackTrace();
   }
}